/**   
* @Title: IRedisService.java 
* @Package com.xzy.service 
*/ 
package cn.circle.redis;

import java.util.List;

/**
 * @ClassName: IRedisService
 * @Description: TODO
 * @author hong
 * @date 2017-8-5 下午4:08:23
 *
 */
public interface IRedisService {
	/**
	 * 添加key-value到数据库
	 * @param key
	 * @param value
	 * @param liveTime 单位秒
	 * @return 
	 */
	public boolean set(String key, String value, long liveTime); 
	
	public boolean set(String key, String value);  
	
	public boolean set(final String key, final Object object, final long liveTime);
	/**
	 * 添加key-value到数据库
	 * @param key
	 * @param object
	 * @return 
	 */
	public boolean set(String key, Object object); 
    
	/**
	 * 根据key读取value
	 * @param key
	 * @return
	 */
    public String get(String key);  
    
    /**
	 * 根据key读取value
	 * @param key
	 * @return
	 */
    public <T> T get(String key, Class<T> clz);
      
    /**
     * 按默认值自减
     * @param key
     * @return
     */
    public long decr(String key);
    
    /**
     * 按给定的值自减
     * @param key
     * @return
     */
    public long decr(String key, long step);
    
    /**
     * 按默认值自增
     * @param key
     * @return
     */
    public long incr(String key);
    
    /**
     * 按给定的值自增
     * @param key
     * @return
     */
    public long incr(String key, long step);
    
    
    /**
     * 判断key是否存在
     * @param key
     * @return
     */
    public boolean hasKey(String key);
    
    /**
     * 为给定 key 设置生存时间，当 key 过期时(生存时间为 0 )，它会被自动删除。
     * @param key
     * @param expire
     * @return
     */
    public boolean expire(String key,long expire);  
     
    /**
     * 添加key-List到数据库
     * @param key
     * @param list
     * @return
     */
    public <T> boolean setList(String key ,List<T> list);  
     
    /**
     * 根据key获取list
     * @param key
     * @param clz
     * @return
     */
    public <T> List<T> getList(String key,Class<T> clz);  
      
    /**
     * 命令将一个或多个值插入到列表头部。 如果 key 不存在，一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时，返回一个错误。
     * @param key
     * @param obj
     * @return
     */
    public long lpush(String key,Object obj);  
    
    /**
     * 命令将一个或多个值插入到列表头部。 如果 key 不存在，一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时，返回一个错误。
     * @param key
     * @param value
     * @return
     */
    public long lpush(String key, String value);  
      
    /**
     * 命令将一个或多个值插入到列表尾部。 如果 key 不存在，一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时，返回一个错误。
     * @param key
     * @param obj
     * @return
     */
    public long rpush(String key,Object obj);  
    
    /**
     * 命令将一个或多个值插入到列表尾部。 如果 key 不存在，一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时，返回一个错误。
     * @param key
     * @param value
     * @return
     */
    public long rpush(String key,String value);  
    
    /**
     * 命令将一个列表值插入到index的位置。 如果 key 不存在，一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时，返回一个错误。
     * @param key
     * @param value
     * @return
     */
    public long lset(final String key, final String value, final long index);
    
    /**
     * 返回列表 key中index位置的元素。
     * @param key
     * @return
     */
    public String lIndex(String key, long index); 
    
    /**
     * 移除并返回列表 key 的头元素。
     * @param key
     * @return
     */
    public String lpop(String key);  
    
    /**
     * 移除并返回列表 key 的头元素, 并转成对象。
     * @param key
     * @return
     */
    public <T> T lpop(final String key, Class<T> clz);
    
    /**
     * 移除并返回列表 key 的尾元素。
     * @param key
     * @return
     */
    public String rpop(String key);  
    
    /**
     * 移除并返回列表 key 的尾元素，并转成对象。
     * @param key
     * @return
     */
    public <T> T rpop(final String key, Class<T> clz);
    
    /**
     * 移除 key 。
     * @param key
     * @return
     */
    public void delete(String key);   
}
